package cn.jinbyte.web.utils;


import org.owasp.encoder.Encode;

/**
 * XSS处理工具类，针对不同场景提供专门的编码方法
 */
public class XssUtils {

    /**
     * 处理HTML内容中的XSS，用于在HTML标签内显示
     * 例如: &lt;div&gt;${content}&lt;/div&gt;
     */
    public static String sanitizeHtmlContent(String value) {
        if (value == null || value.isEmpty()) {
            return value;
        }
        // 使用OWASP的HTML编码
        return Encode.forHtml(value);
    }

    /**
     * 处理HTML属性中的XSS，用于HTML标签属性
     * 例如: &lt;input name="username" value="${value}"&gt;
     */
    public static String sanitizeHtmlAttribute(String value) {
        if (value == null || value.isEmpty()) {
            return value;
        }
        // 使用OWASP的HTML属性编码
        return Encode.forHtmlAttribute(value);
    }

    /**
     * 处理JavaScript中的XSS，用于在脚本中使用
     * 例如: &lt;script&gt;var data = "${value}";&lt;/script&gt;
     */
    public static String sanitizeJavaScript(String value) {
        if (value == null || value.isEmpty()) {
            return value;
        }
        // 使用OWASP的JavaScript编码
        return Encode.forJavaScript(value);
    }

    /**
     * 处理URL参数中的XSS，用于构建URL
     * 例如: /search?query=${value}
     */
    public static String sanitizeUrlParameter(String value) {
        if (value == null || value.isEmpty()) {
            return value;
        }
        // 使用OWASP的URL组件编码
        return Encode.forUriComponent(value);
    }

    /**
     * 通用XSS清理，适用于不确定具体场景的情况
     */
    public static String sanitizeGeneral(String value) {
        value = sanitizeHtmlContent(value);
        value = sanitizeHtmlAttribute(value);
        value = sanitizeJavaScript(value);
        value = sanitizeUrlParameter(value);
        return value;
    }

    /**
     * 判断字符串是否可能包含XSS风险内容
     */
    public static boolean hasPotentialXssRisk(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }

        // 检查常见的XSS模式
        String lowerValue = value.toLowerCase();
        return lowerValue.contains("<script") ||
                lowerValue.contains("javascript:") ||
                lowerValue.contains("onerror") ||
                lowerValue.contains("onload") ||
                lowerValue.contains("eval(") ||
                lowerValue.contains("expression(");
    }
}